NimでSlackBotを作った (nimbot)
NimでSlackのBotを自作した
Slack Botの種類と大まかな作り方 - Qiitaを参考にした
作りたいなぁと思ってから2時間くらいで作った
サーバはwebshのサーバ上に共存させた
孤独のインフラ整備
結局その後全部dockerコンテナ化したのでめちゃくちゃ時間かかったが
成果物
https://gyazo.com/802f58257bea038b1644ab67a5e4eed9
ソースコード
jiro4989/nimbot
使い方
こんな感じでNimのコードを書いて送信すると、バックエンドでNimのコードをコンパイルして実行して、その結果を返す
code:nim
/nimbot
echo "hello"
仕組み
Slackアプリで以下の2つを組み合わせている
Slash commands /で始まるテキストをチャット欄に入力すると、それをコマンドと認識して特定の処理を実行するアプリ
Incomming Webhook 特定のチャンネルにメッセージを送信できるWebHookURL
処理フロー
https://gyazo.com/16c4c6a35fe325e087de8abf8ca5f877
Slackのチャットから/nimbotコマンドでテキストを送る
僕が運用している特定のサーバにPOSTリクエストが飛ぶ
POSTリクエストの中身を取得し、MongoDBに保存する
チャット送信主にokだけ返す
Webサーバとは別プロセスで動作するアプリがMongoDBを読み取る
コードをファイル出力し、Dockerコンテナ上でnimコンパイラに渡して実行
実行結果をIncomingWebhookのURLにPOST
画面に結果が出力される
なぜこんな作りにしたか
slash-commandsにはタイムアウト時間3秒という制限があった
Nimのコードをコンパイルして実行する+Dockerコンテナが起動する時間を含めると3秒では時間が足りない
非同期に処理するために一旦DBに保存だけしてレスポンスを返すようにした
slash-commandsのみだと、コマンドの実行結果がチャット主にしか表示されない
せっかくなのでチャット欄に実行結果を垂れ流したかった
余談
ほとんどwebshと同じような構成で作ったので、Nimのコードとかだいたいコピペで作った
初期リリース時はNimのコード実行部分だけDockerコンテナで動かしていた
それ以外はすべてホストPC上で動かしていた
ローカル開発のときに複数のサービスを起動する必要がでてきて、開発時の動作検証が難しくなってきた
ローカルにファイルを保存してそれをフラグにする構成もホストPCへの依存度を高くしている
すべてDockerコンテナで動かすようにアーキテクチャを再設計する方針に決定
MongoDBを使うようにするのと、そこにログも残す構成にした
2020/3/28 にようやくDockerコンテナ化が完了した
https://github.com/jiro4989/nimbot/pull/11
後からアーキテクチャを変更したので大改修だった
ログの出力書式の違いとかも統一したかったのでfluentdを使うことにした